package com.anlu.concurrent.ch5.bitwise;

import java.io.UnsupportedEncodingException;

/**
 * <p>
 * Description: 演示位运算
 * <p>
 * Copyright: 天津联想协同科技有限公司
 * <p>
 *
 * @author anlu
 * @date 2021/10/27 14:35
 */
public class IntToBinary {
    public static void main(String[] args)throws UnsupportedEncodingException {
        int data = 4;
        System.out.println("the 4 is "+Integer.toBinaryString(data));

        //位与&(1&1=1 1&0=0 0&0=0)
        System.out.println("the 4 is "+Integer.toBinaryString(4));
        System.out.println("the 6 is "+Integer.toBinaryString(6));
        System.out.println("the 10 is "+Integer.toBinaryString(10));
        System.out.println("the 4&6 is "+Integer.toBinaryString(4&6));

        //位或运算 |  (1|1=1 1|0=1 0|0=0)
        System.out.println("the 4|6 is "+Integer.toBinaryString(4|6));


        //位非运算 （~1=0  ~0=1）二进制
        System.out.println("the ~4 is "+Integer.toBinaryString(~4));
        System.out.println("the ~10 is "+Integer.toBinaryString(~10));

        //位异或^ (1^1=0 1^0=1 0^0=0)
        System.out.println("the 4^6 is "+Integer.toBinaryString(4^6));

        //<<有符号左移，>>有符号右移 >>>无符号右移
        //取模的操作 a%(2^n) 等价于a&(2^n-1)  345二进制 101011001
        System.out.println("the 345 % 16 is "+(345%16)+ " or "+(345&(16-1)));


        testLeftMove();

        testRightMove();


    }

    private static void testLeftMove(){
        System.out.println("=========测试左移============");
        //随意写一个数
        int intValue = 733183670;
        //打印intValue
        System.out.println("intValue：" + (intValue));
        //左移1位
        System.out.println("intValue左移1位：" + (intValue << 1));
        //左移8位
        System.out.println("intValue左移8位：" + (intValue << 8));
        //当int类型左移位数大于等于32位操作时，会先求余后再进行移位操作
        //求余为32%32=0，相当于左移0位（不移位）
        System.out.println("intValue左移32位：" + (intValue << 32));
        //求余为40%32=8，相当于左移8位
        System.out.println("intValue左移40位：" + (intValue << 40));
        //求余为64%32=0，相当于左移0位（不移位）
        System.out.println("intValue左移64位：" + (intValue << 64));

        long longValue = 733183670L;
        //打印longValue
        System.out.println("longValue：" + (longValue));
        //左移1位
        System.out.println("longValue左移1位：" + (longValue << 1));
        //左移8位
        System.out.println("longValue左移8位：" + (longValue << 8));
        //当long类型左移位数大于等于64位操作时，会先求余后再进行移位操作
        //求余为64%64=0，相当于左移0位（不移位）
        System.out.println("longValue左移64位：" + (longValue << 64));
        //求余为72%64=8，相当于左移8位
        System.out.println("longValue左移72位：" + (longValue << 72));
        //求余为128%64=0，相当于左移0位（不移位）
        System.out.println("longValue左移128位：" + (longValue << 128));
    }

    private static void testRightMove(){
        System.out.println("=========测试右移=========");
        //随意写一个数
        int intValue = 733183670;
        //打印intValue
        System.out.println("intValue：" + (intValue));
        //右移1位
        System.out.println("intValue右移1位：" + (intValue >> 1));
        //右移8位
        System.out.println("intValue右移8位：" + (intValue >> 8));
        //当int类型右移位数大于等于32位操作时，会先求余后再进行移位操作
        //求余为32%32=0，相当于右移0位（不移位）
        System.out.println("intValue右移32位：" + (intValue >> 32));
        //求余为40%32=8，相当于右移8位
        System.out.println("intValue右移40位：" + (intValue >> 40));
        //求余为64%32=0，相当于右移0位（不移位）
        System.out.println("intValue右移64位：" + (intValue >> 64));

        long longValue = 733183670L;
        //打印longValue
        System.out.println("longValue：" + (longValue));
        //右移1位
        System.out.println("longValue右移1位：" + (longValue >> 1));
        System.out.println("longValue右移8位：" + (longValue >> 8));
        //当long类型右移位数大于等于64位操作时，会先求余后再进行移位操作
        //求余为64%64=0，相当于右移0位（不移位）
        System.out.println("longValue右移64位：" + (longValue >> 64));
        //求余为72%64=8，相当于右移8位
        System.out.println("longValue右移72位：" + (longValue >> 72));
        //求余为128%64=0，相当于右移0位（不移位）
        System.out.println("longValue右移128位：" + (longValue >> 128));
    }
}
